From: Andrew Cooper Date: Tue, 14 Apr 2015 13:07:24 +0000 (+0200) Subject: x86: infrastructure to create BUG_FRAMES in asm code X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~3433 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=0a3e27e8325d357c3df5a8286b550689524ea031;p=xen.git x86: infrastructure to create BUG_FRAMES in asm code Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich --- diff --git a/xen/include/asm-x86/bug.h b/xen/include/asm-x86/bug.h index cd862e31a2..f1a8c9ddcd 100644 --- a/xen/include/asm-x86/bug.h +++ b/xen/include/asm-x86/bug.h @@ -5,6 +5,13 @@ #define BUG_LINE_LO_WIDTH (31 - BUG_DISP_WIDTH) #define BUG_LINE_HI_WIDTH (31 - BUG_DISP_WIDTH) +#define BUGFRAME_run_fn 0 +#define BUGFRAME_warn 1 +#define BUGFRAME_bug 2 +#define BUGFRAME_assert 3 + +#ifndef __ASSEMBLY__ + struct bug_frame { signed int loc_disp:BUG_DISP_WIDTH; unsigned int line_hi:BUG_LINE_HI_WIDTH; @@ -22,11 +29,6 @@ struct bug_frame { ((1 << BUG_LINE_LO_WIDTH) - 1))) #define bug_msg(b) ((const char *)(b) + (b)->msg_disp[1]) -#define BUGFRAME_run_fn 0 -#define BUGFRAME_warn 1 -#define BUGFRAME_bug 2 -#define BUGFRAME_assert 3 - #define BUG_FRAME(type, line, ptr, second_frame, msg) do { \ BUILD_BUG_ON((line) >> (BUG_LINE_LO_WIDTH + BUG_LINE_HI_WIDTH)); \ asm volatile ( ".Lbug%=: ud2\n" \ @@ -66,4 +68,42 @@ extern const struct bug_frame __start_bug_frames[], __stop_bug_frames_2[], __stop_bug_frames_3[]; +#else /* !__ASSEMBLY__ */ + +/* + * Construct a bugframe, suitable for using in assembly code. Should always + * match the C version above. One complication is having to stash the strings + * in .rodata + */ + .macro BUG_FRAME type, line, file_str, second_frame, msg + .L\@ud: ud2a + + .pushsection .rodata.str1, "aMS", @progbits, 1 + .L\@s1: .string8 "\file_str" + .popsection + + .pushsection .bug_frames.\type, "a", @progbits + .L\@bf: + .long (.L\@ud - .L\@bf) + \ + ((\line >> BUG_LINE_LO_WIDTH) << BUG_DISP_WIDTH) + .long (.L\@s1 - .L\@bf) + \ + ((\line & ((1 << BUG_LINE_LO_WIDTH) - 1)) << BUG_DISP_WIDTH) + + .if \second_frame + .pushsection .rodata.str1, "aMS", @progbits, 1 + .L\@s2: .string8 "\msg" + .popsection + .long 0, (.L\@s2 - .L\@bf) + .endif + .popsection + .endm + +#define WARN BUG_FRAME BUGFRAME_warn, __LINE__, __FILE__, 0, 0 +#define BUG BUG_FRAME BUGFRAME_bug, __LINE__, __FILE__, 0, 0 + +#define ASSERT_FAILED(msg) \ + BUG_FRAME BUGFRAME_assert, __LINE__, __FILE__, 1, msg + +#endif /* !__ASSEMBLY__ */ + #endif /* __X86_BUG_H__ */